package com.sisgesbyte.services.proyeccion;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.inject.Inject;

import com.sisgesbyte.common.ConstModAdministracion;
import com.sisgesbyte.common.ConstProyeccion;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.administracion.MantCategoriaProductoDao;
import com.sisgesbyte.dao.administracion.MantenimientoMarcaDao;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.beanDao.ProyeccionFfvvRequest;
import com.sisgesbyte.dao.proyeccion.MantProyeccionClienteDao;
import com.sisgesbyte.dao.proyeccion.MantProyeccionFFVVDao;
import com.sisgesbyte.data.entity.administracion.CategoriaProductoEntity;
import com.sisgesbyte.data.entity.administracion.MarcaEntity;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.entity.comun.GenericResponseEntity;
import com.sisgesbyte.data.entity.proyeccion.ProyeccionClienteEntity;
import com.sisgesbyte.data.entity.proyeccion.ProyeccionFFVVEntity;
import com.sisgesbyte.services.commonBean.GenericGuardarResponse;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.proyeccion.bean.FiltroOpcionesFFVVBean;
import com.sisgesbyte.services.proyeccion.bean.ListaProyFfvvCategoriaResponse;
import com.sisgesbyte.services.proyeccion.bean.ListaProyFfvvMarcasResponse;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionFfvvBean;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionFfvvDetalleBean;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionFfvvDetalleResponse;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionFfvvResponse;
import com.sisgesbyte.services.proyeccion.bean.ProyGeneralCategoriaBean;
import com.sisgesbyte.services.proyeccion.bean.ProyeccionGeneralMarcasBean;
import com.sisgesbyte.services.ventas.MantVendedorClienteService;
import com.sisgesbyte.services.ventas.bean.FFVVBean;
import com.sisgesbyte.services.ventas.bean.FiltroVendedoClienteFO;
import com.sisgesbyte.services.ventas.bean.ListaVendedorClienteResponse;
import com.sisgesbyte.services.ventas.bean.VendedorClienteBean;

@Stateless
public class MantProyeccionFfvvServiceImpl implements MantProyeccionFfvvService {

	@EJB
	private MantProyeccionFfvvDetalleService mantProyeccionFfvvDetalleService;
	@EJB
	private MantProyeccionFFVVDao mantProyeccionFFVVDao;
	@EJB
	private MantenimientoMarcaDao mantenimientoMarcaDao;
	@EJB
	private MantProyeccionClienteDao mantProyeccionClienteDao;
	@EJB
	private MantCategoriaProductoDao mantCategoriaProductoDao;
	@EJB
	private MantVendedorClienteService mantVendedorClienteService;
	@Inject
	private Validaciones validaciones;
	private List<CategoriaProductoEntity> listaHijosCategoriaProd;
	private List<CategoriaProductoEntity> hijos;
	
	@Override
	public ListaProyeccionFfvvResponse mostrarListaProyeccionFfvv(
			String codTransaccion, FiltroOpcionesFFVVBean filtroOpciones) {
		String mensajeTransaccionMetodo = "[mostrarListaProyeccionFfvv idTx=" + codTransaccion + "] - ";
		ListaProyeccionFfvvResponse response = new ListaProyeccionFfvvResponse();
		
		List<ProyeccionFFVVEntity> listaProyeccionFfvv=null;
		try{
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			List<Object> valores = new ArrayList<>();
			List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();

			
			if(filtroOpciones.getIdPeriodo() > 0){
				FiltrosBean listaPeriodo = new FiltrosBean();
				List<String> campoPeriodo = new ArrayList<String>();
				campoPeriodo.add("pf.periodo_id");
				listaPeriodo.setCampos(campoPeriodo);
				listaPeriodo.setOperador("=");
				filtro.add(listaPeriodo);
				valores.add(filtroOpciones.getIdPeriodo());
			}
			if(filtroOpciones.getIdEstructuraId() > 0){
				FiltrosBean listaPeriodo = new FiltrosBean();
				List<String> campoPeriodo = new ArrayList<String>();
				campoPeriodo.add("ee.estructura_venta_id");
				listaPeriodo.setCampos(campoPeriodo);
				listaPeriodo.setOperador("=");
				filtro.add(listaPeriodo);
				valores.add(filtroOpciones.getIdEstructuraId());
			}
			if(filtroOpciones.getIdZona() > 0){
				FiltrosBean listaZona = new FiltrosBean();
				List<String> campoZona = new ArrayList<String>();
				campoZona.add("ee.zona_id");
				listaZona.setCampos(campoZona);
				listaZona.setOperador("=");
				filtro.add(listaZona);
				valores.add(filtroOpciones.getIdZona());
			}
			if(filtroOpciones.getIdCanal() > 0){
				FiltrosBean listaCanal = new FiltrosBean();
				List<String> campoCanal = new ArrayList<String>();
				campoCanal.add("ee.categoria_cliente_id");
				listaCanal.setCampos(campoCanal);
				listaCanal.setOperador("=");
				filtro.add(listaCanal);
				valores.add(filtroOpciones.getIdCanal());
			}
			
			if(filtroOpciones.getIdFfvv() > 0){
				FiltrosBean listaZona = new FiltrosBean();
				List<String> campoZona = new ArrayList<String>();
				campoZona.add("pf.empleado_estructura_id");
				listaZona.setCampos(campoZona);
				listaZona.setOperador("=");
				filtro.add(listaZona);
				valores.add(filtroOpciones.getIdFfvv());
			}
			
			if(filtroOpciones.getTxtBuscar() !=null){
				if(filtroOpciones.getTxtBuscar().trim().length() > 0){
					// filtro por String
						FiltrosBean listaCampo = new FiltrosBean();
						List<String> campo = new ArrayList<String>();
						campo.add("pf.id");
						campo.add("ee.codigo");
						campo.add("co.num_doc");
						campo.add("co.nombre");
						campo.add("co.apellido");
						listaCampo.setCampos(campo);
						listaCampo.setOperador("like");
						filtro.add(listaCampo);
						valores.add("%" + filtroOpciones.getTxtBuscar() + "%");
				}
					// -------------------
			}
			
			filtroSQL.setListaFiltros(filtro);
			filtroSQL.setListaValores(valores);
			
			listaProyeccionFfvv = mantProyeccionFFVVDao.listaProyeccionFFVV(filtroSQL);
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al listar de  BD " + e);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
			return response;
		}
		
		if(listaProyeccionFfvv.size() > 0){
			List<ListaProyeccionFfvvBean> listaFfvv = new ArrayList<ListaProyeccionFfvvBean>();
			for(ProyeccionFFVVEntity ls : listaProyeccionFfvv){
				ListaProyeccionFfvvBean bean = new ListaProyeccionFfvvBean();
				bean.setApellido(validaciones.validarCamposString(ls.getApellido()));
				bean.setCategoriaClienteId(ls.getCategoria_cliente_id());
				bean.setCodigo(validaciones.validarCamposString(ls.getCodigo()));
				bean.setCodigoBanda(validaciones.validarCamposString(ls.getCodigo_banda()));
				bean.setComunObjetoId(ls.getComun_objeto_id());
				bean.setDescripcion(validaciones.validarCamposString(ls.getDescripcion()));
				bean.setEmpleadoEstructuraId(ls.getEmpleado_estructura_id());
				bean.setEmpleadoId(ls.getEmpleado_id());
				bean.setEstructuraVenta(validaciones.validarCamposString(ls.getEstructura_venta()));
				bean.setEstructuraVentaId(ls.getEstructura_venta_id());
				bean.setId(ls.getId());
				bean.setMontoProyectado(ls.getMonto_proyectado());
				bean.setNombre(validaciones.validarCamposString(ls.getNombre()));
				bean.setNumDoc(validaciones.validarCamposString(ls.getNum_doc()));
				bean.setPeriodoId(ls.getPeriodo_id());
				bean.setZonaId(ls.getZona_id());
				
				//capturamos los clientes de este FFVV
				BigDecimal totolAsignadoCliente = BigDecimal.ZERO;
				try{
					FiltroVendedoClienteFO filtroBean = new FiltroVendedoClienteFO();
					filtroBean.setActive(true);
					filtroBean.setIdFfvv(ls.getEmpleado_estructura_id());
					ListaVendedorClienteResponse listaClientes = mantVendedorClienteService.listaVendedorCliente(codTransaccion, filtroBean);
					System.out.println("Vendedor: " + ls.getEmpleado_estructura_id());
					System.out.println("Respuesta Clientes: " + listaClientes.getCodigoRespuesta());
					
					if(listaClientes.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
						List<Integer> listaCliente = new ArrayList<Integer>();
							for(VendedorClienteBean cliente : listaClientes.getListaVendedorCliente() ){
								System.out.println("ID Local"+cliente.getClienteLocalesId());
								System.out.println("ID Cliente"+cliente.getClienteId());
								listaCliente.add(cliente.getClienteLocalesId());
							}
							FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
							List<Object> valores = new ArrayList<>();
							List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();

							if (listaCliente.size() > 0) {
								FiltrosBean listaVenClientes = new FiltrosBean();
								List<String> campoVenClientes = new ArrayList<String>();
								campoVenClientes.add("pc.cliente_local_id");
								listaVenClientes.setCampos(campoVenClientes);
								listaVenClientes.setNumeroValores(listaCliente.size());
								listaVenClientes.setOperador("in");
								filtro.add(listaVenClientes);
								for(Integer val : listaCliente){
									System.out.println("Enviado Id Local : " +val.intValue());
									valores.add(val.intValue());
								}
								
							}
							if (filtroOpciones.getIdPeriodo() > 0) {
								FiltrosBean listaPeriodo = new FiltrosBean();
								List<String> campoPeriodos = new ArrayList<String>();
								campoPeriodos.add("pc.periodo_id");
								listaPeriodo.setCampos(campoPeriodos);
								listaPeriodo.setOperador("=");
								filtro.add(listaPeriodo);
								valores.add(filtroOpciones.getIdPeriodo());
							}

							filtroSQL.setListaFiltros(filtro);
							filtroSQL.setListaValores(valores);
							
							List<ProyeccionClienteEntity> listaProyeccionClientes = mantProyeccionClienteDao.listaProyeccionClientes(filtroSQL);
							if(listaProyeccionClientes.size() > 0){
								for(ProyeccionClienteEntity proy : listaProyeccionClientes){
									
									totolAsignadoCliente = totolAsignadoCliente.add(proy.getMonto_proyectada());
								}
							}
					}
				}catch(Exception e){
					System.out.println("Error al tratar de traer la lista de clientes por vendedor " + e);
					totolAsignadoCliente = BigDecimal.ZERO;
				}
				bean.setMontoAsignadoCliente(totolAsignadoCliente);
				
				int val = ls.getMonto_proyectado().compareTo(totolAsignadoCliente);
			    if( val == 0 ){
			    	bean.setColoMontoProyectado(ConstProyeccion.COLOR_VERDE);
			    }else if( val == 1 ){
			    	bean.setColoMontoProyectado(ConstProyeccion.COLOR_ROJO);
			    }
			    else if( val == -1 ){
			    	bean.setColoMontoProyectado(ConstProyeccion.COLOR_AMARILLO);
			    };
				
				listaFfvv.add(bean);
			}
			response.setIdTransaccion(codTransaccion);
			response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
			response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			response.setListaProyeccionFfvv(listaFfvv);
		}else{
			response.setIdTransaccion(codTransaccion);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDF);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDF);
		}
		
		return response;
	}

	@Override
	public GenericGuardarResponse nuevaProyeccionFfvv(String codTransaccion,
			ListaProyeccionFfvvBean request) {
		String mensajeTransaccionMetodo = "[nuevaProyeccionFfvv idTx=" + codTransaccion + "] - ";
		
		GenericGuardarResponse response = new GenericGuardarResponse();
		
		try{
			ProyeccionFfvvRequest req = new ProyeccionFfvvRequest();
			 req.setCodigoBanda(request.getCodigoBanda());
			 req.setEmpleadoEstructuraId(request.getEmpleadoEstructuraId());
			 req.setMontoProyectado(request.getMontoProyectado());
			 req.setPeriodoId(request.getPeriodoId());
			GenericResponseEntity nuevaProy = mantProyeccionFFVVDao.guardarProyeccionFfvv(req);
			System.out.println("************************<<<<<<<< Codigo: " + nuevaProy.getCod_error());
			if(nuevaProy.getCod_error() == Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)){
				response.setIdTransaccion(codTransaccion);
				response.setCodigoSaved(nuevaProy.getCodigo());
				response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
				response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			}else{
				response.setCodigoRespuesta(String.valueOf(nuevaProy.getCod_error()));
				response.setMensajeRespuesta(nuevaProy.getMsj_error());
			}
			
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al registrar la Proyeccion en BD " + e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT);
		}
		
		return response;
	}

	@Override
	public GenericResponse editarProyeccionFfvv(String codTransaccion,
			ListaProyeccionFfvvBean request) {
		String mensajeTransaccionMetodo = "[editarProyeccionFfvv idTx=" + codTransaccion + "] - ";
		
		GenericResponse response = new GenericResponse();
		
		try{
			ProyeccionFfvvRequest req = new ProyeccionFfvvRequest();
			req.setCodigoBanda(validaciones.validarCamposString(request.getCodigoBanda()));
			req.setEmpleadoEstructuraId(request.getEmpleadoEstructuraId());
			req.setId(request.getId());
			req.setMontoProyectado(request.getMontoProyectado());
			req.setPeriodoId(request.getPeriodoId());
			
			GenericEntity editProy = mantProyeccionFFVVDao.actualizarProyeccionFfvv(req);
			
			if(editProy.getCod_error() == Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)){
				response.setIdTransaccion(codTransaccion);
				response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
				response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			}else{
				response.setCodigoRespuesta(String.valueOf(editProy.getCod_error()));
				response.setMensajeRespuesta(editProy.getMsj_error());
			}
			
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al registrar la Proyeccion en BD " + e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT);
		}
		
		return response;
	}

	@Override
	public GenericResponse deleteProyeccionFfvv(String codTransaccion,
			int codProyeccion) {
		String mensajeTransaccionMetodo = "[deleteProyeccionFfvv idTx=" + codTransaccion + "] - ";
		GenericResponse response = new GenericResponse();
		
		try{
			GenericEntity deleteProy = mantProyeccionFFVVDao.eliminarProyeccionFfvv(codProyeccion);
			
			if(deleteProy.getCod_error() == Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)){
				response.setIdTransaccion(codTransaccion);
				response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
				response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			}else{
				response.setCodigoRespuesta(String.valueOf(deleteProy.getCod_error()));
				response.setMensajeRespuesta(deleteProy.getMsj_error());
			}
			
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al registrar la Proyeccion en BD " + e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT);
		}
		
		return response;
	}

	@Override
	public ListaProyFfvvMarcasResponse mostrarProyFfvvMarcas(
			String codTransaccion, FiltroOpcionesFFVVBean filtrosBean) {
		
		String mensajeTransaccionMetodo = "[mostrarProyFfvvMarcas idTx=" + codTransaccion + "] - ";
		ListaProyFfvvMarcasResponse response = new ListaProyFfvvMarcasResponse();
		List<MarcaEntity> listaMarcas = null;
		try{
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			List<Object> valores = new ArrayList<>();
			List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
			FiltrosBean listaPeriodo = new FiltrosBean();
			List<String> campoPeriodo = new ArrayList<String>();
			campoPeriodo.add("active");
			listaPeriodo.setCampos(campoPeriodo);
			listaPeriodo.setOperador("=");
			filtro.add(listaPeriodo);
			valores.add(true);
			filtroSQL.setListaFiltros(filtro);
			filtroSQL.setListaValores(valores);
			//1.- Obtenemos la lista de marcas de productos
			listaMarcas =mantenimientoMarcaDao.listaMarcas(filtroSQL);
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo+ "Hubo un error al listar marcas de  BD " + e);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
			return response;
		}
		ListaProyeccionFfvvDetalleResponse listaFfvvDetalle = null; 
		try{
			FiltroOpcionesFFVVBean filtroOpciones = new FiltroOpcionesFFVVBean();
			filtroOpciones.setIdFfvv(filtrosBean.getIdFfvv());
			filtroOpciones.setIdPeriodo(filtrosBean.getIdPeriodo());
			listaFfvvDetalle = mantProyeccionFfvvDetalleService.mostrarProyeccionFfvvDetalle(codTransaccion, filtroOpciones);
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo+ "Hubo un error al listar FFVV de  BD " + e);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
			return response;
		}
		
		List<ProyeccionGeneralMarcasBean> listaProyeccionFfvvMarcas = new ArrayList<ProyeccionGeneralMarcasBean>();
		for(MarcaEntity marca : listaMarcas){
			ProyeccionGeneralMarcasBean bean = new ProyeccionGeneralMarcasBean();
			bean.setIdMarca(marca.getId());
			bean.setMarca(validaciones.validarCamposString(marca.getMarca()));
			BigDecimal totalMarca = BigDecimal.ZERO;
				try{
					for(ListaProyeccionFfvvDetalleBean ls : listaFfvvDetalle.getListaProyeccionFfvvDetalle()){
						if(marca.getId()==ls.getMarcaId()){
							totalMarca = totalMarca.add(ls.getCantidadProyectada().multiply(ls.getPrecioPromedio()));
						}
					}
				}catch(Exception e){
					System.out.println("Error al obtener monto " + e);
				}
			bean.setMontoTotal(totalMarca);
			if(totalMarca.compareTo(BigDecimal.ZERO) > 0){
				listaProyeccionFfvvMarcas.add(bean);
			}
		}
		
		if (listaProyeccionFfvvMarcas.size() > 0) {
			response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
			response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			response.setListaProyeccionFfvvMarcas(listaProyeccionFfvvMarcas);;
		} else {
			System.out.println("No se encontro Datos");
			response.setCodigoRespuesta(ConstModAdministracion.MANT_ELIMINAR_COD_IDF);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_ELIMINAR_MSJ_IDF.replace("msj", mensajeTransaccionMetodo));
		}
		
		return response;
	}

	@Override
	public ListaProyFfvvCategoriaResponse mostrarProyFfvvCategoria(
			String codTransaccion, FiltroOpcionesFFVVBean filtrosBean) {
		String mensajeTransaccionMetodo = "[mostrarProyFfvvCategoria idTx=" + codTransaccion + "] - ";
		ListaProyFfvvCategoriaResponse response = new ListaProyFfvvCategoriaResponse();
		
		
		List<CategoriaProductoEntity> listaCategoriaProd = null;
		try{
			
			//1.- obtenemos la lista de categoria de productos
			listaCategoriaProd = mantCategoriaProductoDao.listarCategoriasProd(null);
			this.listaHijosCategoriaProd = listaCategoriaProd;
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al lista de categorias productos de  BD " + e);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
			return response;
		}
		
		ListaProyeccionFfvvDetalleResponse listaFfvvDetalle = null; 
		try{
			FiltroOpcionesFFVVBean filtroOpciones = new FiltroOpcionesFFVVBean();
			filtroOpciones.setIdFfvv(filtrosBean.getIdFfvv());
			filtroOpciones.setIdPeriodo(filtrosBean.getIdPeriodo());
			listaFfvvDetalle = mantProyeccionFfvvDetalleService.mostrarProyeccionFfvvDetalle(codTransaccion, filtroOpciones);
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo+ "Hubo un error al listar FFVV de  BD " + e);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
			return response;
		}
		
		List<ProyGeneralCategoriaBean> listaCategoriaProy = new ArrayList<ProyGeneralCategoriaBean>();
		for(CategoriaProductoEntity categoria : listaCategoriaProd){
			ProyGeneralCategoriaBean bean = new ProyGeneralCategoriaBean();
			bean.setId(categoria.getId());
			bean.setCategoria(categoria.getNombre());
			bean.setIdPadre(categoria.getPadre_id());
			
			hijos = new ArrayList<CategoriaProductoEntity>();
			//agregamos al padre
			hijos.add(categoria);
			//buscamos sus hijos
			capturarHijos(categoria.getId());
			//buscamos los montos de todos sus hijos
			BigDecimal total = BigDecimal.ZERO;
			try{
				for(CategoriaProductoEntity h :hijos){
					for(ListaProyeccionFfvvDetalleBean proy : listaFfvvDetalle.getListaProyeccionFfvvDetalle()){
						if(h.getId() == proy.getCategoriaProductoId()){
							total =total.add(proy.getPrecioPromedio().multiply(proy.getCantidadProyectada()));
						}
					}
				}
			}catch(Exception e){
				total = BigDecimal.ZERO;
			}
			
			bean.setMontoTotal(total);
			
			if(total.compareTo(BigDecimal.ZERO) > 0){
				listaCategoriaProy.add(bean);
			}
		}

		if (listaCategoriaProy.size() > 0) {
			response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
			response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			response.setListaProyFfvvCategoria(listaCategoriaProy);
		} else {
			response.setCodigoRespuesta(ConstModAdministracion.MANT_ELIMINAR_COD_IDF);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_ELIMINAR_MSJ_IDF.replace("msj", mensajeTransaccionMetodo));
		}
		return response;
	}
	public void capturarHijos(int idPadre){
		for(CategoriaProductoEntity hijo :listaHijosCategoriaProd){
			if(idPadre == hijo.getPadre_id()){
				hijos.add(hijo);
				capturarHijos(hijo.getId());
			}
		}
	}
}
